/**获取日期对应的格式字符串 如：2018_12_29 */
function getDayString(date) {
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    var day = date.getDate();
    if (month < 10) {
        month = "0" + month;
    }
    if (day < 10) {
        day = "0" + day;
    }
    return year + "_" + month + "_" + day;
};

/**获得今天的日期字符串 */
function getTodayString() {
    if (!GStorage.todayString) {
        GStorage.todayString = getDayString(new Date());
    }
    return GStorage.todayString;
};

/**获得昨天的日期字符串 */
function getYesterdayString() {
    if (!GStorage.yesterdayString) {
        var date = new Date();
        //得到昨天的时间
        date.setTime(date.getTime() - 24 * 60 * 60 * 1000);
        GStorage.yesterdayString = getDayString(date);
    }
    return GStorage.yesterdayString;
};

/**基础api：设置（存储）数据 */
function setData(key, value) {
    try {
        var data = value && JSON.stringify(value);
        cc.sys.localStorage.setItem(key, data);
        //发送事件
        //key兼容
        var event = key.split(getTodayString())[0];
        GEvent.dispatcher(event, data);
    } catch (e) {
        console.error(key, "setItemToLocalStorage fail");
    }
};

/**基础api：获取数据  
 * key 键名  
 * defaultValue 找不到返回的默认
*/
function getData(key, defaultValue) {
    try {
        var tmp = cc.sys.localStorage.getItem(key);
        if (!tmp) {
            setData(key, defaultValue);
        }
        return tmp ? JSON.parse(tmp) : defaultValue;
    } catch (e) {
        return defaultValue;
    }
};

/**基础api：清除数据*/
function clear(key) {
    cc.sys.localStorage.removeItem(key);
};

/**基础api：数据变化   数据为纯数字的变化 */
function change(key, changes) {
    var num = getData(key);
    if (typeof num == "number") {
        num += changes;
        setData(key, num);
    } else {
        console.error("数据不为数字类型！！");
    }
};

/**本地存储的api集合 */
var GStorage = {

    /**实时更新的键，每天更新一次  
     * 键名，键值要一致
     */
    CHANGEKEY: {
        AD: "AD",

        /**广告加体力次数 */
        AD_SPINS: "AD_SPINS",
        /**广告加金币次数 */
        AD_COINS: "AD_COINS",
    },

    /**固定不变得键 */
    FIXKEY: {
        GAINGOLD: "GAINGOLD",

        /**快速登录 */
        LOGIN_MTKEY: "LOGIN_MTKEY",

        /**FB认证签名 */
        FACEBOOK_ACCESS_TOKEN: "FACEBOOK_ACCESS_TOKEN",

        /**缓存列表，标记资源是否下载 */
        CACHE_LIST: "CACHE_LIST",

        /**语言选择 */
        LANGUAGE: "LANGUAGE",

        /**玩家uid */
        UID: "UID",

        /**IOS订单信息，用于销毁订单用的，因为不像Google可以通过接口获取到，所以得本地保存订单号 */
        IOS_ORDER_INFO: "IOS_ORDER_INFO",

        /**IOS游客唯一标识 */
        IOS_UUID: "IOS_UUID",

        /**老虎机自动转动引导，自动三次以后，不再引导 */
        SLOT_AUTO_GUIDE: "SLOT_AUTO_GUIDE"
    },

    /**获取数据  
     * key 键名  
     * defaultValue 找不到数据时返回的默认值  
     * 例如：  
     * ```js
     GStorage.get(GStorage.CHANGEKEY.AD, 0)
     ```
    */
    get(key, defaultValue) {
        if (this.CHANGEKEY[key] == key) {
            return getData(key + getTodayString(), defaultValue);
        } else if (this.FIXKEY[key] == key || key.indexOf(this.FIXKEY.LOGIN_MTKEY) >= 0) {
            return getData(key, defaultValue);
        } else {
            console.error("%s 未注册的键名！！", key);
        }
    },

    /**设置数据    
     * key 键名  
     * value 设置的值  
     ```js
     GStorage.set(GStorage.CHANGEKEY.AD, 0)
     ```
     */
    set(key, value) {
        if (this.CHANGEKEY[key] == key) {
            setData(key + getTodayString(), value);
        } else if (this.FIXKEY[key] == key || key.indexOf(this.FIXKEY.LOGIN_MTKEY) >= 0) {
            setData(key, value);
        } else {
            console.error("%s 未注册的键名！！", key);
        }
    },

    /**数据变化  键值必须为数字类型  
     * key 键名  
     * changes 变化量 >0 增加  <0 减少  
     ```js
     GStorage.change(GStorage.CHANGEKEY.AD, 1)
     ```
     */
    change(key, changes) {
        if (this.CHANGEKEY[key] == key) {
            change(key + getTodayString(), changes);
        } else if (this.FIXKEY[key] == key) {
            change(key, changes);
        } else {
            console.error("未注册的键名！！");
        }
    },

    /**清除昨天多余的变化键名  */
    clearAllYesterdayCHANGEKEY() {
        for (var key in this.CHANGEKEY) {
            clear(key + getYesterdayString());
        }
    },

    /**通用 基础api：设置（存储）数据（不建议） */
    setData(key, value) {
        setData(key, value);
    },

    /**通用 基础api：获取数据（不建议）  
     * key 键名  
     * defaultValue 找不到返回的默认
    */
    getData(key, defaultValue) {
        return getData(key, defaultValue);
    },


};

window.GStorage = GStorage;

